package com.example.stella.activities;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.stella.MainActivity;
import com.example.stella.R;
import com.example.stella.database.UserDAO;
import com.example.stella.models.User;
import com.example.stella.utils.SessionManager;

/**
 * =================== 用户认证框架 ===================
 * 登录Activity - 处理用户登录和注册
 * 整体架构：数据声明 -> 视图绑定 -> 数据初始化 -> 事件监听 -> 业务实现
 */
public class LoginActivity extends AppCompatActivity {
    
    // =================== 数据声明部分 ===================
    // UI组件声明
    private EditText etUsername, etPassword;    // 用户输入控件
    private Button btnLogin, btnRegister;       // 功能按钮
    
    // 数据处理对象声明
    private UserDAO userDAO;                    // 用户数据访问对象
    private SessionManager sessionManager;     // 用户会话管理器

    // =================== Activity生命周期框架 ===================
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        // 按顺序初始化各个模块
        initViews();        // 1. 初始化视图组件
        initData();         // 2. 初始化数据和检查状态
        setupListeners();   // 3. 设置事件监听器
    }

    // =================== 视图绑定部分 ===================
    /**
     * 数据绑定 - 将布局文件中的视图组件绑定到Java变量
     * 作用：建立UI组件与代码的连接关系
     */
    private void initViews() {
        // 绑定用户输入控件
        etUsername = findViewById(R.id.etUsername);     // 用户名输入框
        etPassword = findViewById(R.id.etPassword);     // 密码输入框
        
        // 绑定功能按钮
        btnLogin = findViewById(R.id.btnLogin);         // 登录按钮
        btnRegister = findViewById(R.id.btnRegister);   // 注册按钮
    }

    // =================== 数据初始化部分 ===================
    /**
     * 数据声明和初始化 - 创建数据处理对象和检查应用状态
     * 作用：准备数据处理工具，检查用户登录状态
     */
    private void initData() {
        // 初始化数据处理工具
        userDAO = new UserDAO(this);                // 用户数据库操作对象
        sessionManager = new SessionManager(this);  // 用户会话管理器

        // 状态检查：如果用户已登录则直接跳转到主页
        if (sessionManager.isLoggedIn()) {
            startActivity(new Intent(this, MainActivity.class));
            finish();   // 关闭登录页面，防止用户返回
        }
    }

    // =================== 事件监听设置部分 ===================
    /**
     * 事件绑定 - 为UI组件设置用户交互事件监听器
     * 作用：响应用户的点击操作，执行相应的业务逻辑
     */
    private void setupListeners() {
        // 登录按钮事件 - 执行用户登录验证
        btnLogin.setOnClickListener(v -> performLogin());
        
        // 注册按钮事件 - 执行用户注册
        btnRegister.setOnClickListener(v -> performRegister());
    }

    // =================== 业务逻辑实现部分 ===================
    /**
     * 数据实现 - 执行用户登录验证逻辑
     * 作用：验证用户输入，查询数据库，管理登录状态
     */
    private void performLogin() {
        // 数据获取：从UI控件获取用户输入
        String username = etUsername.getText().toString().trim();
        String password = etPassword.getText().toString().trim();

        // 数据验证：检查输入完整性
        if (username.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "请输入用户名和密码", Toast.LENGTH_SHORT).show();
            return;
        }

        // 数据查询：验证用户凭据
        if (userDAO.validateUser(username, password)) {
            // 登录成功流程
            User user = userDAO.getUserByUsername(username);        // 获取用户信息
            sessionManager.createLoginSession(user.getId(), user.getUsername()); // 创建登录会话
            
            // 用户反馈和页面跳转
            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
            startActivity(new Intent(this, MainActivity.class));   // 跳转到主页
            finish();   // 关闭登录页面
        } else {
            // 登录失败反馈
            Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 数据实现 - 执行用户注册逻辑
     * 作用：验证用户输入，检查用户名唯一性，创建新用户账户
     */
    private void performRegister() {
        // 数据获取：从UI控件获取用户输入
        String username = etUsername.getText().toString().trim();
        String password = etPassword.getText().toString().trim();

        // 数据验证：检查输入完整性
        if (username.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "请输入用户名和密码", Toast.LENGTH_SHORT).show();
            return;
        }

        // 数据查询：检查用户名是否已存在
        if (userDAO.isUserExists(username)) {
            Toast.makeText(this, "用户名已存在", Toast.LENGTH_SHORT).show();
            return;
        }

        // 数据创建：创建新用户并保存到数据库
        User user = new User(username, password);      // 创建用户对象
        long userId = userDAO.insertUser(user);        // 插入到数据库

        if (userId > 0) {
            // 注册成功流程：自动登录新用户
            sessionManager.createLoginSession((int) userId, username); // 创建登录会话
            
            // 用户反馈和页面跳转
            Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();
            startActivity(new Intent(this, MainActivity.class));   // 跳转到主页
            finish();   // 关闭登录页面
        } else {
            // 注册失败反馈
            Toast.makeText(this, "注册失败", Toast.LENGTH_SHORT).show();
        }
    }
} 